package org.pictual.action;

import java.net.URLEncoder;
import java.util.Locale;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.pictual.business.dao.MySQLDAOFactory;
import org.pictual.business.dao.exceptions.DAOException;
import org.pictual.business.vo.CompletoVO;
import org.pictual.business.vo.DefinicionVO;
import org.pictual.business.vo.IdiomaVO;
import org.pictual.business.vo.ImagenVO;
import org.pictual.business.vo.PalabraVO;
import org.pictual.controller.DatabaseImg;
import org.pictual.controller.GoogleSearchImg;
import org.pictual.controller.MyImage;
import org.pictual.controller.WikiObtieneDatos;
import org.pictual.controller.WikiTrataDatos;
import org.pictual.controller.mainPackage.Language;
import org.pictual.service.PictualDelegateFactory;
import org.pictual.util.Cache;
import org.pictual.util.GetPronun;
import org.pictual.util.RequestKeys;
import org.pictual.util.SessionKeys;


public class TranslateWikiCacheAction extends Action {

	protected static Logger log= Logger.getLogger(TranslateWikiCacheAction.class);
	private IdiomaVO idiomaVO;
	private DefinicionVO definicionVO;
	private PalabraVO palabraVO;
	private ImagenVO[] imagenes = new ImagenVO[6];
	private String cadena_wiki;
	private String query;
	private String langLeft;
	private String langRight;

	String[] langz={"en", "es", "de", "fr"};
	
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		HttpSession session = request.getSession();
		
		if(request.getParameter(RequestKeys.LANGUAGE)!=null){

			Locale locale = new Locale(request.getParameter(RequestKeys.LANGUAGE), "");
			request.getSession().setAttribute(org.apache.struts.Globals.LOCALE_KEY,locale);
		}
		
		//Obtengo los parametros de busqueda
		query = request.getParameter(RequestKeys.QUERY);
		langLeft = request.getParameter(RequestKeys.FROM);
		langRight = request.getParameter(RequestKeys.TO);
		
		if(query==null){
			query=(String) session.getAttribute(SessionKeys.QUERY);
		}
		
		if(langLeft==null){
			langLeft=(String) session.getAttribute(SessionKeys.FROM);
		}
		
		if(langRight==null){
			langRight=(String) session.getAttribute(SessionKeys.TO);
		}
		
		
		//codifico la query
		
		//Si hay consulta
		if(query!=null){
			String queryUTF8 = URLEncoder.encode(query, "UTF-8");
		

			//idiomas nulos son en ingles
			if((langLeft.equals("")) || ((langLeft.equals(null))) )
				langLeft="en";
			if (langRight.equals("") || ((langRight.equals(null)))  )
				langRight="en";
			
			//parametros en sesion
			session.setAttribute("left", langLeft);
			session.setAttribute("rigth", langRight);
			session.setAttribute("query", query);
			
			//claves de idiomas
			int lang1 = Language.resolve(langLeft);
			int lang2 = Language.resolve(langRight);
			
			log.info("Query: "+query);
			log.info("QueryUTF8: "+queryUTF8);
			log.info("Lenguajes: "+lang1+": "+langLeft+"_"+lang1+": "+langRight);
			
			
	//		ParamWrapper wrapper = new ParamWrapper();
	
			try{
				if(!query.contains(" ")){
					query = queryUTF8;
				}
				query = removeSpacesForInformation(query);
				query = cambiar(query);
	
				String origen = langz[lang1];
				String destino = langz[lang2];
				log.info("Búsqueda: "+query+" with language "+origen +" "+destino);

				Vector<MyImage> images;
				int datos = 0;
				
				Cache <String, CompletoVO> cache = (Cache<String, CompletoVO>) session.getServletContext().getAttribute("cache");
				String cadenaParaCache = query+"/"+langLeft+"/"+langRight;
				
				if(!cache(cache, session, cadenaParaCache)){
					
					//0 si no esta en la base de datos y relleno los VO de Wiki
					datos=checkDataSource(cache, cadenaParaCache);
					
					//obtengo un vector con las imagenes de base de datos o de google
					images=findImages(datos);
				}
				else{
					CompletoVO completo;
					completo = cache.get(cadenaParaCache);
					idiomaVO = completo.getIdiomaVO();
					definicionVO = completo.getDefinicionVO();
					palabraVO = completo.getPalabraVO();
					imagenes = completo.getImagenes();
					images=findImages(3);
					
					log.info("Se recupera de cache");
				}
				
				log.info(idiomaVO);
				log.info(definicionVO);
				log.info(palabraVO);
				
				//METER EN EL REQUEST
				request.setAttribute(RequestKeys.IMAGES, images);
				request.setAttribute(RequestKeys.IDIOMA, idiomaVO);
				request.setAttribute(RequestKeys.DEFINICION, definicionVO);
				request.setAttribute(RequestKeys.PALABRA, palabraVO);
				
				if(idiomaVO!=null){
					
					if (idiomaVO.getVerbo()!=null) {
						String conjugate = "#";
						if (langLeft.equals("en")) {
							conjugate = "http://www.wordreference.com/conj/EnVerbs.aspv="+ query;
						}
						if (langLeft.equals("es")) {
							conjugate = "http://www.wordreference.com/conj/EsVerbs.asp?v="+ query;
						}
						if (langLeft.equals("de")) {
							conjugate = "http://www.canoo.net/services/Controller?dispatch=inflection&lang=de&input="+ query + "&features=(Cat+V)";
						}
						if (langLeft.equals("fr")) {
							conjugate = "http://www.wordreference.com/conj/FrVerbs.asp?v="+ query;
						}
						
						request.setAttribute(RequestKeys.CONJUGATE, conjugate);
					}
					
					String enlace = "#";
	                if(langRight.equals("en")){
	                    if(langLeft.equals("es")){
	                        enlace = "http://www.wordreference.com/es/en/translation.asp?spen="+query;
	                    }
	                    if(langLeft.equals("en")){
	                        enlace = "http://www.merriam-webster.com/dictionary/"+query;
	                    }
	                    if(langLeft.equals("de")){
	                    	String q = query;
							q = q.replaceAll("ü", "ue");
							q = q.replaceAll("ß", "ss");
							q = q.replaceAll("ä ", "ae");
							q = q.replaceAll("ö", "oe");
	                        enlace = "http://es.bab.la/diccionario/aleman-ingles/"+q;
	                    }
	                    if(langLeft.equals("fr")){
	                        enlace = "http://www.wordreference.com/fren/"+query;
	                    }
	                }
	                if(langRight.equals("es")){
	                    if(langLeft.equals("es")){
	                        enlace = "http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=" + query;
	                    }
	                    if(langLeft.equals("en")){
	                        enlace = "http://www.wordreference.com/es/en/translation.asp?spen="+query;
	                    }
	                    if(langLeft.equals("de")){
	                        enlace = "http://dict.leo.org/esde?lp=esde&lang=de&searchLoc=0&cmpType=relaxed&sectHdr=on&spellToler=&search="+query;
	                    }
	                    if(langLeft.equals("fr")){
	                        enlace = "http://diccionario.reverso.net/espanol-frances/"+query;
	                    }
	                }
	                if(langRight.equals("de")){
	                    if(langLeft.equals("es")){
	                        enlace = "http://es.bab.la/diccionario/espanol-aleman/"+query;
	                    }
	                    if(langLeft.equals("en")){
	                        enlace = "http://es.bab.la/diccionario/ingles-aleman/"+query;
	                    }
	                    if(langLeft.equals("de")){
	                        enlace = "http://www.dwds.de/?woerterbuch=1&kompakt=1&sh=1&qu="+query;
	                    }
	                    if(langLeft.equals("fr")){
	                        enlace = "http://dict.leo.org/frde?lp=frde&lang=de&searchLoc=0&cmpType=relaxed&sectHdr=on&spellToler=&search="+query;
	                    }
	                }
	                if(langRight.equals("fr")){
	                    if(langLeft.equals("es")){
	                        enlace = "http://www.larousse.com/fr/dictionnaires/espagnol-francais/"+query;
	                    }
	                    if(langLeft.equals("en")){
	                        enlace = "http://www.larousse.com/fr/dictionnaires/anglais-francais/"+query;                                                    }
	                    if(langLeft.equals("de")){
	                        enlace = "http://www.larousse.com/fr/dictionnaires/allemand-francais/"+query;
	                    }
	                    if(langLeft.equals("fr")){
	                        enlace = "http://www.larousse.com/fr/dictionnaires/francais/"+query;
	                    }
	                }
	                request.setAttribute(RequestKeys.ENLACE, enlace);
	                
	                String pronunciacion = new GetPronun(query, langLeft).getPhonetic();
	                if(pronunciacion==null) pronunciacion=idiomaVO.getPronunciacion();
	                request.setAttribute(RequestKeys.PRONUNCIACION, pronunciacion);	
	                
		//			wrapper.setImages(images);
					
					request.setAttribute(RequestKeys.IMAGES, images);	
					
				}
				
				
				
				//Si no estaba en base de datos lo inserto
				if(datos==0)
					insertInDataBase();
				
			} catch(Exception e){
				log.error("Error: ", e);
			}
		
			session.setAttribute(SessionKeys.QUERY, query);
			session.setAttribute(SessionKeys.FROM, langLeft);
			session.setAttribute(SessionKeys.TO, langRight);
//			System.out.println("en session: "+session.getAttribute(SessionKeys.FROM));
//			System.out.println("en session: "+session.getAttribute(SessionKeys.TO));
			
//			MySQLDAOFactory.closeConnection();
		}
		return mapping.findForward("success");
	}
	
	public String removeSpacesForInformation(String s){
		return s.replaceAll(" ", "_");   //trimmedString;
	}

	public String removeSpacesForImages(String s){
		s = cambiar(s);
		return s.replaceAll(" ","+");   //trimmedString;
	}
	
	public String cambiar(String query2){
		query2 = query2.replaceAll("%C3%83%C2%A1", "Ã¡");
		query2 = query2.replaceAll("%C3%83%C2%A9", "Ã©");
		query2 = query2.replaceAll("%C3%83%C2%AD", "Ã­");
		query2 = query2.replaceAll("%C3%83%C2%B3", "Ã³");
		query2 = query2.replaceAll("%C3%83%C2%BA", "Ãº");
		query2 = query2.replaceAll("%C3%83%C2%B1", "Ã±");
		query2 = query2.replaceAll("%C3%83%C2%BC", "Ã¼");
		query2 = query2.replaceAll("%C3%83%C2%AB","Ã«");
		query2 = query2.replaceAll("%C3%83%C2%AF", "Ã¯");
		query2 = query2.replaceAll("%C3%83%C2%B6", "Ã¶");
		query2 = query2.replaceAll("%C3%83%C2%A4", "Ã¤");
		query2 = query2.replaceAll("%C2%81%C2%A2", "ï�¢");
		query2 = query2.replaceAll("%C3%83%C2%A2", "Ã¢");
		query2 = query2.replaceAll("%C3%83%C2%AA", "Ãª");
		query2 = query2.replaceAll("%C3%83%C2%AE", "Ã®");
		query2 = query2.replaceAll("%C3%83%C2%B4", "Ã´");
		query2 = query2.replaceAll("%C3%83%C2%BB", "Ã»");
		query2 = query2.replaceAll("%C3%83%C2%A0", "Ã ");
		query2 = query2.replaceAll("%C3%83%C2%A8", "Ã¨");
		query2 = query2.replaceAll("%C3%83%C2%AC", "Ã¬");
		query2 = query2.replaceAll("%C3%83%C2%B2", "Ã²");
		query2 = query2.replaceAll("%C3%83%C2%B9", "Ã¹");
		query2 = query2.replaceAll("%C3%83%C2%BF", "Ã¿");
		query2 = query2.replaceAll("%C3%83%C2%81", "Ã�");
		query2 = query2.replaceAll("%C3%83%C2%89", "Ã‰");
		query2 = query2.replaceAll("%C3%83%C2%8D", "Ã�");
		query2 = query2.replaceAll("%C3%83%C2%93", "Ã“");
		query2 = query2.replaceAll("%C3%83%C2%9A", "Ãš");
		query2 = query2.replaceAll("%C3%83%C2%80", "Ã€");
		query2 = query2.replaceAll("%C3%83%C2%88", "Ã‰");
		query2 = query2.replaceAll("%C3%83%C2%8C", "Ã�");
		query2 = query2.replaceAll("%C3%83%C2%92", "Ã“");
		query2 = query2.replaceAll("%C3%83%C2%99", "Ãš");
		query2 = query2.replaceAll("%C3%83%C2%84", "Ã„");
		query2 = query2.replaceAll("%C3%83%C2%8B", "Ã‹");
		query2 = query2.replaceAll("%C3%83%C2%8F", "Ã�");
		query2 = query2.replaceAll("%C3%83%C2%96", "Ã–");
		query2 = query2.replaceAll("%C3%83%C2%9C", "Ãœ");
		query2 = query2.replaceAll("%C3%85%C2%93", "Å“");
		query2 = query2.replaceAll("%C3%83%C2%A7", "Ã§");
		query2 = query2.replaceAll("%C3%83%C2%9F", "ÃŸ");
		return query2;
	}
	
	public boolean cache(Cache <String, CompletoVO> cache, HttpSession session, String cadenaParaCache){
		//CACHE
		/*
		 * Crear una nueva cache de 100 elementos, con código Integer y
		 * contenido String (clave y valor pueden ser de cualquier clase).
		 */
		
		//guardar en el contexto de la aplicación
		if(cache == null){
			log.info("CACHE: No existe cache. Se crea");
			cache = new Cache<String, CompletoVO>(100);
			session.getServletContext().setAttribute("cache", cache);
		}
		log.info("CACHE: Clave de cache: "+cadenaParaCache);
		// para guardar un dato, codigo de 
		//cache.put(cadenaParaCache, new CompletoVO());
		  
		/* 
		 * Ahora busquemos un código, suponiendo que si no lo encontramos
		 * debemos buscarlo por ejemplo en base de datos.
		 */
		CompletoVO palabraEnCache = cache.get(cadenaParaCache);
		if (palabraEnCache == null) {
		    log.info("CACHE: No esta en cache");
		    return false;
		    
		}else{
			/* una vez obtenido, lo guardamos en cache por si se vuelve a pedir. */
			log.info("CACHE: Esta en cache");
		    cache.put(cadenaParaCache, palabraEnCache);
		    
		}
		return true;
		//CACHE
	}
	public int checkDataSource(Cache <String, CompletoVO> cache, String cadenaParaCache){
		boolean ofdatabase = fillTheVOifExistInDatabase(cache, cadenaParaCache);
		//Si no esta en la base de datos
		if(!ofdatabase){
			log.info("La palabra "+query +" no esta en la BBDD. Busco en wiki");
			cadena_wiki=WikiObtieneDatos.getData(query, langRight);
			if(cadena_wiki.isEmpty()){
				log.error("La palabra no esta en la wiki seleccionada");
				return -1;
			}
			WikiTrataDatos wtd = new WikiTrataDatos(query, cadena_wiki, langRight, langLeft);
			log.info("Los datos han sido obtenidos de wiki");
			idiomaVO = wtd.getIdiomaVO();
			definicionVO = wtd.getDefinicionVO();
			palabraVO = wtd.getPalabraVO();
//			imagenes = wtd.getImagenes();
			log.info("Los datos están en los VO");
			
			CompletoVO completo = new CompletoVO();
			
			completo.setIdiomaVO(idiomaVO);
			completo.setDefinicionVO(definicionVO);
			completo.setPalabraVO(palabraVO);
			completo.setImagenes(imagenes);
			
			/* una vez obtenido, lo guardamos en cache por si se vuelve a pedir. */
		    cache.put(cadenaParaCache, completo);
		    log.info("se rellena para cache");
		    
			return 0;
		}
		return 1;
	}
	
	public boolean fillTheVOifExistInDatabase(Cache <String, CompletoVO> cache, String cadenaParaCache){
		//TODO 1 idioma por palabra (se mejora)
		//TODO 4 definiciones por palabra (si ya esta se muestra)
		//TODO Si no hay idioma, no hay palabra
		
		//En la tabla definicion habria hasta 16 veces cada palabra. una por cada wiki (destino) x hasta 4 veces de origen
		//en la tabla idioma habria hasta 4 veces la palabra 
		
		
		
		CompletoVO completo = new CompletoVO();
		
		try {
			completo = PictualDelegateFactory.getIdiomaDelegate().selectPalabraCompleta(query, Language.resolve(langLeft)+1, Language.resolve(langRight)+1);
		
			if(completo==null) return false;
			 
			idiomaVO = PictualDelegateFactory.getIdiomaDelegate().readIdioma(query, Language.resolve(langLeft)+1);
			definicionVO = PictualDelegateFactory.getDefinicionDelegate().readDefinicion(idiomaVO.getPalabra_id(), idiomaVO.getIdioma(), Language.resolve(langRight)+1);
			palabraVO = PictualDelegateFactory.getPalabraDelegate().readPalabra(definicionVO.getPalabra_id());
			imagenes[0] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_1());
			imagenes[1] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_2());
			imagenes[2] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_3());
			imagenes[3] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_4());
			imagenes[4] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_5());
			imagenes[5] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_6());

			completo.setIdiomaVO(idiomaVO);
			completo.setDefinicionVO(definicionVO);
			completo.setPalabraVO(palabraVO);
			completo.setImagenes(imagenes);
			
			
			/* una vez obtenido, lo guardamos en cache por si se vuelve a pedir. */
		    cache.put(cadenaParaCache, completo);
		    log.info("se rellena para cache");
		    
		} catch (DAOException e) {
			log.error("mensaje: "+e.getMessage(), e);
			return false;
		}
	
		
		
//		IdiomaVO origen = new IdiomaVO();
//		origen.setIdioma(langLeft);
//		
//		IdiomaVO destino = new IdiomaVO();
//		destino.setIdioma(langRight);
//		
//		
//		origen.setIdioma(langRight);
//		idiomaVO = PictualDelegateFactory.getIdiomaDelegate().readIdioma(query, origen.getIdioma());
//		if(idiomaVO==null) return false;
//		definicionVO = PictualDelegateFactory.getDefinicionDelegate().readDefinicion(idiomaVO.getPalabra_id(), idiomaVO.getIdioma(), destino.getIdioma());
//		if(definicionVO==null) return false;
//		log.info("ID: de la palabra"+definicionVO.getPalabra_id()+" ."+idiomaVO.getPalabra_id());
//		palabraVO = PictualDelegateFactory.getPalabraDelegate().readPalabra(definicionVO.getPalabra_id());
//		imagenes[0] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_1());
//		imagenes[1] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_2());
//		imagenes[2] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_3());
//		imagenes[3] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_4());
//		imagenes[4] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_5());
//		imagenes[5] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_6());
//		
//		if((idiomaVO!=null)&&(definicionVO!=null)) return true;
		
		
//		if(idiomaVO!=null){
//			//La palabra esta en la base de datos, la buscamos en la wiki elegida.
//			definicionVO = PictualDelegateFactory.getDefinicionDelegate().readDefinicion(idiomaVO.getPalabra_id(), idiomaVO.getIdioma(), destino.getIdioma());
//			if(definicionVO!=null){
//				//    			Con el  id_palabra busco en la base de datos en la tabla Palabra y guardo los datos en la clase PalabraVO
//				palabraVO = PictualDelegateFactory.getPalabraDelegate().readPalabra(definicionVO.getPalabra_id());
//				//    			Con los datos de cada id_imagen almacenados en PalabraVO voy haciendo una búsqueda para cada una en la base de datos en la tabla Imagen obteniendo los datos y almacenándolos en 6 objetos ImagenVO.
//				imagenes[0] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_1());
//				imagenes[1] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_2());
//				imagenes[2] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_3());
//				imagenes[3] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_4());
//				imagenes[4] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_5());
//				imagenes[5] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_6());
//
//				log.info("Los datos se han obtenido de la base de datos de Pictual");
//				return true;
//			}else{
//				//TODO hay idioma pero no definicion, por lo tanto tengo que obtener de wiki la definicion y demas. y si puedo mejorar el idioma
//			}
//		}
		//    	Si no devuelve resultados, la palabra no esta en nuestra base de datos:
		
		return true;
	}
	
	public Vector<MyImage> findImages(int n){
		Vector<MyImage> images = null;
		log.info("Pasa por findimages");
		if(n==0){
			log.info("Es 0 se descargaran las imagenes");
			images = GoogleSearchImg.queryForImages(query, langLeft);
			int i=0;
			for(MyImage img: images){
				log.info("imagen encontrada");
				imagenes[i]=new ImagenVO();
				imagenes[i].setHeight(img.getHeight());
				imagenes[i].setWidth(img.getWidth());
				imagenes[i].setPath_big(img.getImgLink());
				imagenes[i].setPath_small(img.getImgThumbnail());
				log.info(i+": "+imagenes[i].getPath_big());
				i++;
			}
		}
		if(n==1){	//las coge de base de datos
			images = DatabaseImg.getVectorImages(imagenes);
		}
		if(n==3){	//las coge de la cache
			
			images = DatabaseImg.getVectorImages(imagenes);
		}
		return images;
	}
	
	public void insertInDataBase(){
		for(ImagenVO img: imagenes){
			if(img!=null) PictualDelegateFactory.getImagenDelegate().insertImagen(img);
		}
		if(imagenes[0]!=null) palabraVO.setImagen_1(imagenes[0].getImagen_id());
		if(imagenes[1]!=null) palabraVO.setImagen_2(imagenes[1].getImagen_id());
		if(imagenes[2]!=null) palabraVO.setImagen_3(imagenes[2].getImagen_id());
		if(imagenes[3]!=null) palabraVO.setImagen_4(imagenes[3].getImagen_id());
		if(imagenes[4]!=null) palabraVO.setImagen_5(imagenes[4].getImagen_id());
		if(imagenes[5]!=null) palabraVO.setImagen_6(imagenes[5].getImagen_id());
		
//		System.out.println("*******************************************************************************************");
//		System.out.println(palabraVO);
//		System.out.println(definicionVO);
//		System.out.println(idiomaVO);
		
		int palabra_id=PictualDelegateFactory.getPalabraDelegate().insertPalabra(palabraVO);
		definicionVO.setPalabra_id(palabra_id);
		idiomaVO.setPalabra_id(palabra_id);
		
		if(PictualDelegateFactory.getIdiomaDelegate().readIdioma(idiomaVO.getNombre(), idiomaVO.getIdioma())==null)
			PictualDelegateFactory.getIdiomaDelegate().insertIdioma(idiomaVO);
		if(PictualDelegateFactory.getDefinicionDelegate().readDefinicion(definicionVO.getPalabra_id(), definicionVO.getIdioma_origen(), definicionVO.getIdioma_destino())==null)
			PictualDelegateFactory.getDefinicionDelegate().insertDefinicion(definicionVO);
	}
}
